import { ClueData } from './types';
import { CaseService } from './CaseService';

// AI服务类，负责提供与AI相关的功能
export class AIService {
  // 获取嫌疑人的初始问候语
  public static getInitialGreeting(suspectId: string, caseId: string): string {
    // 根据不同的嫌疑人返回不同的问候语
    const greetings: Map<string, string> = new Map([
      ['suspect1', '你好，侦探。我已经听说了林小姐的事情，这太可怕了。我能帮你做什么吗？'],
      ['suspect2', '你好，请问有什么我可以帮助你的吗？关于林小姐的案子，我知道的都可以告诉你。'],
      ['suspect3', '你好，我是王先生。我和林小姐是业务上的合作关系，对于她的离世我感到非常遗憾。'],
      ['suspect4', '您好，我是博物馆的刘馆长。对于画作的丢失，我们都感到非常震惊和遗憾。'],
      ['suspect5', '晚上好，侦探。我是今晚的值班保安陈保安。您有什么问题要问我吗？'],
      ['suspect6', '你好，我是赵教授。这幅"月夜"是我研究多年的作品，它的丢失对艺术界来说是巨大的损失。'],
      ['suspect7', '您好，我是研发总监郑总监。关于芯片设计图纸泄露的事情，我们正在全力配合调查。'],
      ['suspect8', '你好，我是孙工程师。我确实参与了芯片项目的开发，但我绝对没有泄露任何机密。'],
      ['suspect9', '您好，我是周助理。我负责公司内部文件的流转，对于这次泄露事件我感到非常意外。']
    ]);

    return greetings.get(suspectId) || '你好，请问有什么可以帮助你的吗？';
  }

  // 生成嫌疑人的回答
  public static generateResponse(userQuestion: string, suspectId: string, caseId: string): string {
    // 这里模拟AI生成回答的逻辑
    // 在实际应用中，这里可以调用真实的AI服务API
    
    // 标准化用户问题，便于匹配回答模板
    const normalizedQuestion = userQuestion.toLowerCase();
    
    // 根据不同的案件和嫌疑人提供不同的回答
    const caseDetail = CaseService.getCaseDetail(caseId);
    
    // 神秘公寓凶杀案的回答
    if (caseId === 'case1') {
      // 张先生的回答
      if (suspectId === 'suspect1') {
        if (normalizedQuestion.includes('案发当晚') || normalizedQuestion.includes('行踪')) {
          return '案发当晚我在加班，公司的监控可以证明。我大约在晚上10点才离开公司，那个时候...';
        } else if (normalizedQuestion.includes('分手') || normalizedQuestion.includes('复合')) {
          return '是的，我们三个月前分手了。我确实想过复合，但林小姐说她需要时间考虑。我尊重她的决定。';
        } else if (normalizedQuestion.includes('钥匙')) {
          return '我以前确实有她公寓的钥匙，但分手后我就还给她了。我没有再去过她的公寓。';
        }
      }
      
      // 李女士的回答
      else if (suspectId === 'suspect2') {
        if (normalizedQuestion.includes('案发当晚') || normalizedQuestion.includes('值班')) {
          return '我当晚在公寓的管理室值班，直到晚上11点才离开。期间我没有看到任何可疑的人进入大厦。';
        } else if (normalizedQuestion.includes('关系') || normalizedQuestion.includes('不好')) {
          return '我们确实有些小矛盾，但都是关于公寓管理的事情，绝对没有到要杀人的地步。';
        } else if (normalizedQuestion.includes('钥匙')) {
          return '作为管理员，我确实有所有住户的备用钥匙，但这些钥匙都锁在管理室的保险柜里，只有我能打开。';
        }
      }
      
      // 王先生的回答
      else if (suspectId === 'suspect3') {
        if (normalizedQuestion.includes('案发当晚') || normalizedQuestion.includes('行踪')) {
          return '当晚我在参加一个商务晚宴，有很多人可以为我作证。我根本不认识林小姐，怎么会杀她？';
        } else if (normalizedQuestion.includes('业务往来') || normalizedQuestion.includes('合作')) {
          return '我和林小姐的公司确实有业务往来，但我都是和她的上级联系，很少直接和她接触。';
        } else if (normalizedQuestion.includes('台灯') || normalizedQuestion.includes('凶器')) {
          return '我不知道什么台灯，我从来没有见过那个东西。';
        }
      }
    }
    
    // 消失的艺术品的回答
    else if (caseId === 'case2') {
      // 刘馆长的回答
      if (suspectId === 'suspect4') {
        if (normalizedQuestion.includes('安保') || normalizedQuestion.includes('监控')) {
          return '我们的安保系统一直运行良好，这次故障是前所未有的。我们已经联系了系统供应商进行调查。';
        } else if (normalizedQuestion.includes('价值') || normalizedQuestion.includes('保险')) {
          return '这幅画价值连城，我们为它购买了巨额保险。但无论如何，它的艺术价值是无法用金钱衡量的。';
        }
      }
      
      // 陈保安的回答
      else if (suspectId === 'suspect5') {
        if (normalizedQuestion.includes('巡逻') || normalizedQuestion.includes('检查')) {
          return '我按照规定每小时巡逻一次，最后一次检查展厅是在晚上11点，当时画作还在。';
        } else if (normalizedQuestion.includes('远程登录') || normalizedQuestion.includes('系统')) {
          return '我...我不知道什么远程登录。我只是一个保安，不懂这些技术问题。';
        }
      }
    }
    
    // 公司机密泄露案的回答
    else if (caseId === 'case3') {
      // 孙工程师的回答
      if (suspectId === 'suspect8') {
        if (normalizedQuestion.includes('薪资') || normalizedQuestion.includes('纠纷')) {
          return '是的，我确实对我的薪资不太满意，但我从来没有想过要背叛公司。我热爱我的工作。';
        } else if (normalizedQuestion.includes('星辰科技') || normalizedQuestion.includes('联系')) {
          return '我...我确实和星辰科技的HR联系过，但只是咨询一下行业情况，并没有其他意思。';
        } else if (normalizedQuestion.includes('下载') || normalizedQuestion.includes('图纸')) {
          return '我绝对没有下载过完整的设计图纸！我只是下载了我负责的那部分代码。';
        }
      }
    }
    
    // 默认回答
    return this.getRandomDefaultResponse();
  }

  // 检查回答是否真实
  public static isResponseTruthful(suspectId: string, caseId: string): boolean {
    // 根据不同的案件和嫌疑人设定不同的诚实度
    // 这里简化处理，只有真正的凶手才会说谎
    
    // 神秘公寓凶杀案
    if (caseId === 'case1') {
      return suspectId !== 'suspect3'; // 王先生是凶手，会说谎
    }
    
    // 消失的艺术品
    else if (caseId === 'case2') {
      return suspectId !== 'suspect5'; // 陈保安是凶手，会说谎
    }
    
    // 公司机密泄露案
    else if (caseId === 'case3') {
      return suspectId !== 'suspect8'; // 孙工程师是凶手，会说谎
    }
    
    // 默认诚实
    return true;
  }

  // 检查是否发现了新线索
  public static checkForNewClue(userQuestion: string, suspectResponse: string, caseId: string): ClueData | null {
    // 标准化问题和回答，便于匹配线索触发条件
    const normalizedQuestion = userQuestion.toLowerCase();
    const normalizedResponse = suspectResponse.toLowerCase();
    
    // 神秘公寓凶杀案的线索
    if (caseId === 'case1') {
      if ((normalizedQuestion.includes('台灯') || normalizedQuestion.includes('凶器')) && 
          normalizedResponse.includes('不知道') && normalizedResponse.includes('台灯')) {
        return {
          id: 'clue7',
          description: '王先生声称他不知道现场的台灯，但作为业务伙伴，他应该知道林小姐的办公室布置。',
          type: '口供',
          isKey: true
        };
      }
    }
    
    // 消失的艺术品的线索
    else if (caseId === 'case2') {
      if ((normalizedQuestion.includes('远程登录') || normalizedQuestion.includes('系统')) && 
          (normalizedResponse.includes('不知道') || normalizedResponse.includes('不懂'))) {
        return {
          id: 'clue8',
          description: '陈保安对远程登录系统的问题表现得很紧张，似乎在刻意回避。',
          type: '口供',
          isKey: true
        };
      }
    }
    
    // 公司机密泄露案的线索
    else if (caseId === 'case3') {
      if ((normalizedQuestion.includes('下载') || normalizedQuestion.includes('图纸')) && 
          normalizedResponse.includes('绝对没有') && normalizedResponse.includes('完整')) {
        return {
          id: 'clue9',
          description: '孙工程师强调他没有下载完整的设计图纸，这与服务器日志记录不符。',
          type: '口供',
          isKey: true
        };
      }
    }
    
    // 没有发现新线索
    return null;
  }

  // 获取随机的默认回答
  private static getRandomDefaultResponse(): string {
    const defaultResponses = [
      '我不太清楚你在说什么。',
      '我已经告诉过你我知道的一切了。',
      '这是个很难回答的问题。',
      '我需要时间想想。',
      '为什么你会这么问？',
      '这和案件有什么关系吗？',
      '我记不太清楚了。',
      '你能换个方式问吗？'
    ];
    
    const randomIndex = Math.floor(Math.random() * defaultResponses.length);
    return defaultResponses[randomIndex];
  }
}